package com.mrx.example.util;

import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import com.alibaba.druid.pool.DruidDataSource;

/**
 * 代码配置的 MyBatis 工具类
 *
 * @author Mr.X
 */
public class MyBatisUtils {

    /**
     * 是否是学校机房
     */
    private static final boolean isInClass = true;
    /**
     * 单例模式, 本类唯一实例
     */
    public static final MyBatisUtils INSTANCE = new MyBatisUtils();
    /**
     * Druid 数据源
     */
    private final DruidDataSource ds = new DruidDataSource();

    private final JdbcTransactionFactory transactionFactory = new JdbcTransactionFactory();

    private final Environment environment = new Environment("dev", transactionFactory, ds);

    /**
     * 私有化构造方法, 构建一个 MyBatisUtils 对象
     */
    private MyBatisUtils() {
        ds.setName("MYSQL");
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        if (isInClass) {
            // 当 忽略 主机、端口 时, 默认使用 localhost:3306
            ds.setUrl("jdbc:mysql:///test");
            ds.setUsername("root");
            ds.setPassword("123");
        } else {
            ds.setUrl("jdbc:mysql:///javaweb");
            ds.setUsername("root");
        }
        ds.setInitialSize(5);
        ds.setMinIdle(5);
        ds.setMaxActive(10);
        ds.setMaxWait(10000);
        ds.setTestWhileIdle(true);
        ds.setValidationQuery("SELECT 1");
    }

    /**
     * 获取一个 SqlSessionFactory
     *
     * @param mapperClazz 要获取 SqlSessionFactory 的 Mapper
     * @return 该 Mapper 的 SqlSessionFactory
     */
    public SqlSessionFactory getSqlSessionFactory(Class<?> mapperClazz) {
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(mapperClazz);
        return new SqlSessionFactoryBuilder().build(configuration);
    }
}
